﻿/**
 * \file Joueur.cs
 * \brief represente une joueur
 * */
namespace Implementation
{
	using interfaces;
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

    [SerializableAttribute()]
	public class Joueur : interfaces.Joueur
	{
		private Civilisation civilisation;

        private Jeu jeu;

		private string nom;

		private bool ajoue;

        private int nbTour;

        private string color;
        
		public virtual bool aJouee()
		{
            return ajoue;
		}

		public Joueur(String name, Civilisation civ, String col)
		{
            nbTour = 0;
            ajoue = false;
            nom = name;
            this.civilisation = civ;
            this.color = col;
		}

        public Jeu getJeu()
        {
            return jeu;
        }

        public void setJeu(Jeu j)
        {
            this.jeu = j;
        }

        public int getNbTour()
        {
            return nbTour;
        }

        public string getColor()
        {
            return color;
        }

        public string getNom()
        {
            return nom;
        }

		public virtual void plus1Tour()
		{
            nbTour++;
		}

		public virtual void setAJoue(bool aj)
		{
            ajoue = aj;
		}

		public virtual void selectionUnites()
		{
			throw new System.NotImplementedException();
		}

		public virtual void selectionVille()
		{
			throw new System.NotImplementedException();
		}

        public virtual Civilisation getCivilisation()
        {
            return civilisation;
        }

        /**
         * \fn caseBonnePourVille
         * \param[in] int
         * \param[in] int
         * \brief calcul si l'on peut construire une ville sur la case en param
         * \return bool
         */
        public virtual Boolean caseBonnePourVille(int x, int y)
        {
            List<Ville> vs = civilisation.getVilles();
            foreach (Ville v in vs)
            {
                if ((v.getX() == x) && (v.getY() == y))
                    return false;
                if ((Math.Abs(v.getX() - x) < 5) || (Math.Abs(v.getY() - y) < 5))
                    return false;
            }
            vs = jeu.getEnemie(this).getCivilisation().getVilles();
            foreach (Ville v in vs)
            {
                if ((Math.Abs(v.getX() - x) < 5) && (Math.Abs(v.getY() - y) < 5))
                    return false;
            }
            return true;
        }

        /**
         * \fn void initialiseMove()
         * \brief remet les valeur de mouvement des unités à leur valeurs initiales
         * \return void
         */
        public virtual void initialiseMove()
        {
            civilisation.getUnites().ForEach(delegate(Unite u)
            {
                u.initialiseMouvement();
            });
        }

        /**
         * \fn void updateVille()
         * \brief vérifie que les villes peuvent s'étendre et si oui le fait
         * \return void
         */
        public virtual void updateVille()
        {
            civilisation.getVilles().ForEach(delegate(Ville v)
            {
                v.expensionDeVille();
            });
           
        }

        /**
         * \fn void updateUnite()
         * \brief fait passer le tour aux unités
         * \return void
         */
        public virtual void updateUnite()
        {
            civilisation.getUnites().ForEach(delegate(Unite u)
            {
                u.passerTour();
            });

        }

        /**
         * \fn void mettreAjourUnitCarte()
         * \brief met à jour la liste des unités
         * \return void
         */
        public virtual void mettreAjourUnitCarte()
        {
            List<Unite> us = civilisation.getUnites();
            foreach (Unite u in us)
            {
                jeu.getCarte().rajoutUnitPos(u.getX(), u.getY(), u); 
            }
        }


	}
}

